
#ifndef __ESCENARIOMODELO__H_
#define __ESCENARIOMODELO__H_

#include "Pacman.h"
#include "Fantasma.h"
#include "Grilla.h"
#include "Lista.h"
#include "ObjetoVivo.h"
#include "Sendero.h"
#include "BonusModel.h"
#include "EscenarioBackTracking.h"

using namespace std;

class EscenarioModelo {
    
	private:
        Pacman *pacman1, *pacman2;
        Sendero* sendero;
		Lista<ObjetoVivo>* fantasmasJugador1;
        Lista<ObjetoVivo>* fantasmasJugador2;
        //Lista<ObjetoVivo>* coleccionBonus;
		BonusModel* bonus;
		int filas;
		int columnas;

		// Contador y bandera de colision de fantasma-Pacman
		bool colisionEntrePacmansActiva ;	
		bool colisionEntreBonusPacman ;  
		int contColisionesFantasmaPacmanEnemigo ;
		int contColisionesFantasmaPacmanAmigo ;
		bool colisionPacmanAmigo ;
		bool colisionPacmanEnemigo ;
		// -------

		EscenarioBackTracking* escenarioBackTracking;

        static EscenarioModelo* instanciaUnica;
        EscenarioModelo();

		void chequearColisionFantasmaPacman(Fantasma* unFantasma, Pacman* unPacman);
    public:	
		
		static unsigned int factorMapeoSendero ;
        static EscenarioModelo* getEscenario();

        void generarSendero(Grilla* grilla);
        void vivirEscenario();
        bool perteneceAlSendero(Punto* punto);
        void agregarBonus(BonusModel* bonus);
		BonusModel* getBonusDelEscenario();
        void chequearColisiones();
		bool huboColisionEntrePacmans();
		bool huboColisionFantasmaPacmanAmigo();
		bool huboColisionFantasmaPacmanEnemigo();
		bool huboColisionEntreBonusPacman();
		
		int getRadioStandard();
        void setPacmanJugador1(Pacman* unPacman);
        void setPacmanJugador2(Pacman* unPacman);
        Pacman* getPacmanJugador1();
        Pacman* getPacmanJugador2();

		Sendero* getSendero(); 

        Lista<ObjetoVivo>* getFantasmasJugador1();
        Lista<ObjetoVivo>* getFantasmasJugador2();

		void addFantasmasJugador1(ObjetoVivo* unFantasma);
		void addFantasmasJugador2(ObjetoVivo* unFantasma);

		int getFilas();
		int getColumnas();

		Punto* getPuntoMedioDelBonus();
		void destroy();
		~EscenarioModelo();
};

#endif